GoLang 初见
官方文档翻译与实践
Go编码前置知识
go以包的形式组织代码,一个包(package)代表一个文件夹下一系列源文件的集合,他们会被一起编译,被定义在同个包下的方法(functions)、类型(types)、变量(variables)、常量(constants),在该工作区下是共享可见的。
一个存储库,可以包含一个或者多个模块(modules),一个模块是一系列一起发布的相关go包(packages)的集合。一个go存储库,通常只包含一个模块(module),位于存储库的根目录。根目录下有个名为go.mod
的文件声明了该模块的模块路径:模块内所有包的导入路径前缀。该模块包含其下级具有自己的go.mod
文件的直属模块,不含直属模块下级包含go.mod
文件的子目录。(这个存疑,感觉文档写的英语有点绕,等后面在看到合适的解释,再修改)
go工作空间,允许你使用本地依赖,类似于Monorepo模式下的工作空间,本地依赖可以作为实际依赖进行引入。
go包的导入path:go.mod
文件中的首行module example.com/web-service-gin
,不仅声明了包的名字,也表示了该包的下载地址应为: https://example.com/web-service-gin
。
在指定module内执行go install
、go install .
、go install 该包的module path
,会build该包为二进制可执 行文件到GOBIN目录下
,如需修改/重置GOBIN
环境变量配置,可通过以下命令:
# 默认为 linux等:$HOME/go/bin windows: /users/XXX/go/bin
# 修改
go env -w GOBIN=/somewhere/else/bin
# 重置
go env -u GOBIN
go install
这样的命令,需要在module包中执行,否则会报错,要区别于前端的npm install
;为了方便起见,go 命令接受相对于工作目录的路径,所以在module包内指定go.mod
位置,执行go install
、go install .
、go install 该go.mod声明的module path
是等效 的。
环境变量GOPATH
指定了go程序的工作区位置,GOBIN
环境变量也可配置为:%GOPATH%/bin
添加go工作区位置到系统环境变量,则工作区内bin目录的二进制可执行文件即可快速在任何位置执行
# Windows users should consult /wiki/SettingGOPATH 其实就是将 /users/xxx/go目录添加到环境变量
# for setting %PATH%. -- linux等
export PATH=$PATH:$(dirname $(go list -f '{{.Target}}' .))
hello
# Hello, world.
包名(module path)的命名规范,应可以直接匹配为:HTTPS URL,这样更有利于 别人或者自己引用,也有助于代理服务收录。
如何引用本地包呢,可以创建一个本地包的形式进行演示:
在hello目录新建morestrings目录,该目录下新建revers.go
,并键入如下代码:
// 引用官网示例
// Package morestrings implements additional functions to manipulate UTF-8 encoded strings,
// beyond what is provided in the standard "strings" package.
package morestrings
// ReverseRunes returns its argument string reversed rune-wise left to right.
func ReverseRunes(s string) string {
r := []rune(s)
for i, j := 0, len(r)-1; i < len(r)/2; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
由于我们编写的function使用了upper-case形式命名,所以他是一个被导出的方法,可以被引入他的其他包使用。
接下来可以在当前目录执行go build
,这不会产生输出文件。相反,它会将编译后的包保存在本地构建缓存中。--这样我们就可以在其他包进行直接引用
然后我 们可以在hello目录,新建主入口文件hello.go
,并编写代码如下:
package main
import (
"fmt"
"example/user/hello/morestrings"
)
func main() {
fmt.Println(morestrings.ReverseRunes("!oG ,olleH"))
}
随后执行go install
,更新可执行二进制执行文件,完成后执行hello
命令
hello
# Hello, Go!
引入远程的包,则需要引入后执行go mod tidy
进行远程包下载(已下载过的包就不会再次下载了),此命令还会删除没用到的包。
go mod tidy
下载的包会被下载到GOPATH
目录下的pkg/mod子目录中,被下载到这里的module,会共享到其他modules(如果引入的版本号一致);所以此目录中的文件都是只读的。如需移除所有下载过的modules,则需要执行:
go clean -modcache